﻿using AForge.Video.DirectShow;
using System;

namespace Black.CameraCapture
{
    /// <summary>
    /// Représente une résolution supportée
    /// </summary>
    public sealed class DisplayDefinition : IComparable<DisplayDefinition>
    {
        #region Propriétés

        /// <summary>
        /// Obtient le taux de rafraichissement moyen
        /// </summary>
        public int AverageFrameRate
        {
            get;
            internal set;
        }

        /// <summary>
        /// Obtient la hauteur de l'image
        /// </summary>
        public double FrameHeight
        {
            get;
            internal set;
        }

        /// <summary>
        /// Obtient la largeur de l'image
        /// </summary>
        public double FrameWidth
        {
            get;
            internal set;
        }

        /// <summary>
        /// Obtient le taux de rafraichissement maximum
        /// </summary>
        public int MaximumFrameRate
        {
            get;
            internal set;
        }

        /// <summary>
        /// Obtient le nom de cette définition
        /// </summary>
        public string Name
        {
            get
            {
                return (string.Format("Frame: {0}x{1}, Rate: {2}/{3}", this.FrameWidth, this.FrameHeight, this.AverageFrameRate, this.MaximumFrameRate));
            }
        }

        #endregion

        #region Constructeurs

        /// <summary>
        /// Constructeur de la classe
        /// </summary>
        /// <param name="data">Données sur la définition</param>
        internal DisplayDefinition(VideoCapabilities data)
        {
            this.AverageFrameRate = data.AverageFrameRate;
            this.FrameHeight = Convert.ToDouble(data.FrameSize.Height);
            this.FrameWidth = Convert.ToDouble(data.FrameSize.Width);
            this.MaximumFrameRate = data.MaximumFrameRate;
        }

        #endregion

        #region Fonctions publiques

        /// <summary>
        /// Compare deux instances
        /// </summary>
        /// <param name="other">Instance de comparaison</param>
        /// <returns>Indice de comparaison</returns>
        public int CompareTo(DisplayDefinition other)
        {
            double factor1 = this.FrameWidth * this.FrameHeight;
            double factor2 = other.FrameWidth * other.FrameHeight;

            return (factor1.CompareTo(factor2));
        }

        #endregion
    }
}
